#include "KEY\key.h"

// 定义按键
#define KEY0_PIN GPIO_PIN_15
#define KEY1_PIN GPIO_PIN_2
#define KEY2_PIN GPIO_PIN_3
#define KEY3_PIN GPIO_PIN_4
#define KEY0_PORT GPIOD
#define KEY1_PORT GPIOG
#define KEY2_PORT GPIOG
#define KEY3_PORT GPIOG

// 读取按键
#define KEY0_Read HAL_GPIO_ReadPin(KEY0_PORT,KEY0_PIN)
#define KEY1_Read HAL_GPIO_ReadPin(KEY1_PORT,KEY1_PIN)
#define KEY2_Read HAL_GPIO_ReadPin(KEY2_PORT,KEY2_PIN)
#define KEY3_Read HAL_GPIO_ReadPin(KEY3_PORT,KEY3_PIN)

/*
 * 函    数：按键初始化，配置引脚为输入模式，上拉输入
 * 参    数：无
 * 返 回 值：无
 */
void Key_Init(void)
{
    //已经在Cude初始化了，就不走这里进行初始化了
}

/*
	@函数说明：读取按键值，返回按下对应按键的序号，内部调用
	@模式（uint8_t mode）：选择模式，0不支持连按，1支持连按
	@作者：吴广金
	@时间：2023年11月22日
*/
static uint8_t KEY_Scan(uint8_t mode)
{
    static uint8_t key_up=1;     //按键松开标志
    if(mode==1)key_up=1;    //支持连按
    if(key_up&&(KEY0_Read==0||KEY1_Read==0||KEY2_Read==0||KEY2_Read==0))
    {
        key_up=0;
        if(KEY0_Read == 0)       return KEY0_PRES;
        else if(KEY1_Read==0)  return KEY1_PRES;
        else if(KEY2_Read==0) 	return KEY2_PRES;   
				else if(KEY3_Read==0) 	return KEY3_PRES;			
    }else if(KEY0_Read==1 && KEY1_Read==1 && KEY2_Read==1 && KEY3_Read==1)//全都没按
			key_up=1;
    return 0;   //无按键按下
}

struct KEY_Class key_class = {
	.init = Key_Init,
	.getNum = KEY_Scan
};

struct KEY_Class * get_KEY_Class(void)
{
	return &key_class;
}
